//
//  NSDate+Extension.h
//  ChartsDemo
//
//  Created by yunda on 2021/7/30.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSDate (Category)

#pragma mark--Property
@property (nonatomic, readonly) NSInteger j_year; ///< Year component
@property (nonatomic, readonly) NSInteger j_month; ///< Month component
@property (nonatomic, readonly) NSInteger j_day; ///< Day component
@property (nonatomic, readonly) NSInteger j_hour; ///< Hour component
@property (nonatomic, readonly) NSInteger j_minute; ///< Minute component
@property (nonatomic, readonly) NSInteger j_second; ///< Second component

@property (nonatomic, readonly) NSInteger j_weekday; ///< Weekday component
@property (nonatomic, readonly) NSInteger j_weekdayOrdinal; ///< WeekdayOrdinal component
@property (nonatomic, readonly) NSInteger j_weekOfMonth; ///< WeekOfMonth component
@property (nonatomic, readonly) NSInteger j_weekOfYear; ///< WeekOfYear component
@property (nonatomic, readonly) NSInteger j_yearForWeekOfYear; ///< YearForWeekOfYear component
@property (nonatomic, readonly) BOOL j_isLeapMonth; ///< 是否闰月
@property (nonatomic, readonly) BOOL j_isLeapYear; ///< 是否闰年

#pragma mark--Update
/**
 * 当前日期+n年
 */
- (NSDate *)j_dateByAddingYears:(NSInteger)years;

/**
 * 当前日期+n月
 */
- (NSDate *)j_dateByAddingMonths:(NSInteger)months;

/**
 * 当前日期+n周
 */
- (NSDate *)j_dateByAddingWeeks:(NSInteger)weeks;

/**
 * 当前日期+n天
 */
- (NSDate *)j_dateByAddingDays:(NSInteger)days;

/**
 * 当前日期+n小时
 */
- (NSDate *)j_dateByAddingHours:(NSInteger)hours;

/**
 * 当前日期+n分钟
 */
- (NSDate *)j_dateByAddingMinutes:(NSInteger)minutes;

/**
 * 当前日期+n秒
 */
- (NSDate *)j_dateByAddingSeconds:(NSInteger)seconds;

/// 获取当前日期偏移几个月几号
- (NSDate *)j_dateByAddingMonths:(NSInteger)months days:(NSInteger)days;

#pragma mark--Formatter
/**
 将日期格式化成字符串
 @param format 格式，例如 @"yyyy-MM-dd HH:mm:ss"
 */
- (NSString *)j_stringWithFormat:(NSString *)format;
// UTC 时间格式化位北京时间
- (NSString *)j_stringWithUTCFormat:(NSString *)format;
/**
 从字符串解析出日期 (解析失败则返回nil)
 @param dateString 日期字符串，例如 "2010-07-09 16:13:30"
 @param format     日期格式，例如 "yyyy-MM-dd HH:mm:ss"
 */
+ (NSDate *)j_dateWithString:(NSString *)dateString format:(NSString *)format;

/// 格式化日期转换成毫秒
+ (NSTimeInterval)j_intervalWithString:(NSString *)dateString format:(NSString *)format;

/// 判断当前是 1:上午  2:下午  3:晚上
+ (NSInteger)j_periodOfTimeWithDateString:(NSString *)dateString;

/// 根据小时和分钟设置具体的时间，日期默认为当前日期
+ (NSDate *)j_dateWithHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;
/// 根据年月日时分设置具体的时间
+ (NSDate *)j_dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;

#pragma mark--获取时间间隔
/// 得到这个周的第一天和最后一天
- (NSArray *)j_getFirstAndLastDayOfThisWeek;

/// 得到这个月的第一天和最后一天
- (NSArray *)j_getFirstAndLastDayOfThisMonth;

/// 判断两个时间是否是同一天
- (BOOL)j_isTheSameDay:(NSDate *)date;

/// 获取当前日期的前n个月或后n个月时间
- (NSString *)beforeMonth:(NSInteger)n;

/// 获取当前日期的前n个月或后n个月时间 date
- (NSDate *)dateOfBeforeMonth:(NSInteger)n;

/// 获取当前日期的前n天或后n天时间
- (NSString *)beforeDay:(NSInteger)n;

/// 获取当前日期的前n天或后n天时间nsdate
- (NSDate *)dateOfBeforeDay:(NSInteger)n;
/**
 当前日期的月开始时间和结束时间
 @param dateFormat 日期格式
 @return 结果字典 key firstDay , lastDay
 */
- (NSDictionary *)getMonthBeginAndEndWith:(NSString *)dateFormat;

/**
 当前日期的周开始时间和结束时间

 @param firstWeekday 星期起始日 // 默认周一为第一天，1.周日 2.周一 3.周二 4.周三 5.周四 6.周五  7.周六
 @param dateFormat 日期格式
 @return 结果字典 key firstDay , lastDay
 */
- (NSDictionary *)getWeekBeginAndEndWith:(NSUInteger)firstWeekday dateFormat:(NSString *)dateFormat;

/**
 当前日期的上个月月开始时间和结束时间
 @param dateFormat 日期格式
 @return 结果字典 key firstDay , lastDay
 */
- (NSDictionary *)getLastMonthBeginAndEndWith:(NSString *)dateFormat;
@end

NS_ASSUME_NONNULL_END
